package com.itheima.demo08_innerClass;

/*
需求: 调用一次FlyAble接口中的抽象方法fly
	实现步骤:
    	1.定义实现类实现FlyAble接口
    	2.实现类覆盖重写FlyAble接口的所有抽象方法
    	3.创建实现类的对象
    	4.实现类对象调用fly方法

	发现问题:
    	就为了调用一次FlyAble接口中的fly方法,我们目前需要定义实现类实现接口,
    	实现类覆盖重写接口中所有的抽象方法,创建实现类对象,实现类对象调用方法,
    	总共需要四步完成,太麻烦

	解决方案: 匿名内部类对象
*/

/*
    匿名内部类对象
    1.概念:
        是内部类的简化写法。它的本质是一个 带具体实现的 父类或者父接口的 匿名的 子类对象。

    2.作用:
        (1)是一种创建接口实现类对象的快捷方式
            把创建实现类,覆盖重写抽象方法,创建实现类对象,实现类对象调用方法这四步合成一步完成

        (2)是一种创建抽象父类的子类对象的快捷方式
            把创建子类,覆盖重写抽象方法,创建子类对象,子类对象调用方法这四步合成一步完成

    3.匿名内部类对象创建格式:
        new 抽象父类/接口(); //错误: 不能直接new抽象父类/接口的对象

        new 抽象父类/接口() {
            覆盖重写所有的抽象方法;
        };

        注意:
            (1)上面只是创建了一个抽象父类的子类对象或者接口的实现类对象
            (2)该对象目前没有名字
            (3)该对象所属的类是没有名字的
                (注意:其实有名字(外部类名$1.class),只是该名字不是我们起的,是JVM帮助我们起的)
*/
public class Demo10 {

    public static void main(String[] args) {
        //定义了FlyAble有名字的子类Bird，创建了Bird类的对象
        //3.多态的方式创建实现类的对象
        //FlyAble bird = new Bird();
        //4.实现类对象调用fly方法
        //bird.fly();

        //匿名内部类
        FlyAble b = new FlyAble() {
            @Override
            public void fly() {
                System.out.println("小蜜蜂，嗡嗡嗡！");
            }
        };
        b.fly();

        FlyAble b2 = new FlyAble() {
            @Override
            public void fly() {
                System.out.println("喷气飞，轰轰轰！");
            }
        };

        b2.fly();


        //一般来说，匿名内部类是为了简化代码
        new FlyAble() {
            @Override
            public void fly() {
                System.out.println("悄无声息，随风飘荡，一根线拽着飞！");
            }

        }.fly();

    }
}
